package com.sunrise.configuracoes.servico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.configuracoes.repositorio.iface.FuncionalidadeDao;
import com.sunrise.configuracoes.repositorio.iface.PerfilDao;
import com.sunrise.configuracoes.repositorio.iface.PermissaoDao;
import com.sunrise.generico.entidade.Funcionalidade;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.Permissao;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterPerfilService {
	
	@Resource(name = "perfilDaoImpl")
	@Getter
	private PerfilDao perfilDao;
	
	@Resource(name = "funcionalidadeDaoImpl")
	@Getter
	private FuncionalidadeDao funcionalidadeDao;
	
	@Resource(name = "permissaoDaoImpl")
	@Getter
	private PermissaoDao permissaoDao;

	public Perfil carregarPerfil(Long id) {
		Perfil perfil = perfilDao.getById(id);
		perfil.getPermissoes().size();
		return perfil;
	}

	public Collection<Perfil> listarOrdenado() {
		return perfilDao.listarOrdenado();
	}
	
	public Collection<Funcionalidade> listarFuncionalidadesOrdenado() {
		Collection<Funcionalidade> funcionalidades = funcionalidadeDao.listarOrdenado();
		for(Funcionalidade funcionalidade : funcionalidades){
			funcionalidade.setPermissoes(permissaoDao.listarPorFuncionalidade(funcionalidade.getId()));
		}
		return funcionalidades;
	}

	@Transactional(readOnly = false)
	public String remover(Perfil perfil) {
		perfil.setPermissoes(null);
		perfilDao.alterar(perfil);
		perfilDao.remover(perfil);
		
		return MessagesUtil.getMessageKey("removidoSucesso");
	}

	
	
	@Transactional(readOnly = false)
	public void inserirPerfil(Perfil perfil) {
		perfilDao.inserir(perfil);
	}
	
	@Transactional(readOnly = false)
	public String inserir(Perfil perfil, List<Permissao[]> permissoes) {
		perfilDao.inserir(carregarPermissoes(perfil, permissoes));
		return MessagesUtil.getMessageKey("criadoSucesso");
	}
	
	@Transactional(readOnly = false)
	public String salvar(Perfil perfil, List<Permissao[]> permissoes){
		perfil = carregarPermissoes(perfil, permissoes);
		perfilDao.alterar(perfil);
		return MessagesUtil.getMessageKey("alteradoSucesso");
	}
	
	private Perfil carregarPermissoes(Perfil perfil, List<Permissao[]> permissoes) {
		perfil.setPermissoes(new ArrayList<Permissao>());
		for(int cont = 1; cont <= permissoes.size(); cont++){
			Object[] aux = permissoes.get(cont - 1);
			for(int cont2 = 1; cont2 <= aux.length; cont2++){
				Permissao permissao = (Permissao) aux[cont2 - 1];
				perfil.getPermissoes().add(permissao);
			}
		}
		return perfil;
	}

	public Collection<Perfil> buscarPorFiltros(Filtro filtro) {
		return getPerfilDao().buscarPorFiltros(filtro);
	}


	
}



